本來要在 Day 17 One-to-One 放這首新歌當 BGM 但一個忙碌就把它給忘了
今天歌曲是紫棋改編改詞的翻唱歌曲 ⟪唯一⟫,推薦給大家
在現實世界中經常會發現其中一個事物與其他多品項有所關聯。這樣的現象在資料庫設計中稱為 One-to-Many 關聯。今天會討論這種關聯的特點、實作方式,以及如何在 Spring Data JPA 中正確地使用它。
One-to-Many 關聯,意思是一實體 A 可以與多個實體 B 有所關聯,但是一個實體 B 只能與一個實體 A 關聯。
舉例:
要在 Spring Data JPA 中實現 One-to-Many 關聯,主要會使用 @OneToMany
和 @ManyToOne
這兩個註解。
範例:
假設有 Author
和 Book
兩個實體,它們之間的關聯如下:
@Entity
public class Author {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "author", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Book> books;
}
- @OneToMany: 定義這是一個一對多的關係。這個屬性的值是一個集合類型(例如 List、Set 等)。
- mappedBy = "post": 指定由 Book 中的 author 屬性來進行映射。
- cascade = CascadeType.ALL: 所有關於 books 的資料庫操作都會影響主實體,這裡主實體是 Author。
- orphanRemoval = true: 當 Book 被從 books 集合中移除時,這個 Book 會被刪除。
- 這裡的
@OneToMany
註解表示Author
與多本Book
有所關聯。
@Entity
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
@ManyToOne
@JoinColumn(name = "author_id")
private Author author;
}
- 而
@ManyToOne
則表示Book
只能與一位Author
有所關聯。
N+1 查詢:當我們從 Author
實體中取得其相關的多本 Book
時,可能會遇到這個問題。
solution:使用 JPA 的 JOIN FETCH
或考慮使用 Hibernate 的 BatchSize
註解。
資料同步:在雙向關聯中,當一方的資料變動時,另一方可能不會同步更新。
solution:當更新一邊的資料時,記得也要手動更新另一邊的資料,以確保資料的一致性。
資料庫性能:使用 EAGER 加載策略可能導致資料庫效能下降。
solution:在不需要 EAGER 加載的情況下,優先使用 LAZY 加載。